"""
    重载
"""

class Thread:
    def __init__(self, name, age, score, sex) -> None:
        self.name = name
        self.age = age
        self.score = score
        self.sex = sex
        
    # str重载, 将对象解析成字符串，对人友好，可以自定义内容
    def __str__(self):
        """
            可以自定义输出，__str__()原本输出的是一个对象<__main__.Thread object at 0x000001D3329F8490>
        """
        return f"我叫{self.name}, 今年{self.age}岁，成绩为：{self.score}，性别{self.sex}。"
    
    
    # repr 重载，字符串解释器可以识别(有格式)
    def __repr__(self) -> str:
        return f"Thread({self.name},{self.age},{self.score},{self.sex})"
    
# zs = Thread('张三',16, 88, '男')
# print(zs)


# ww = repr(zs)
# print(ww)

# eval() 可以执行字符串类的代码，例如: "1+1+2*5", 直接识别而不用转换
# ls = eval(repr(zs)) # 两个加一起使用可以实现克隆,必须重写repr方法才行
# print(ls.name)



#%% 克隆对象
class Enemy:
    def __init__(self, name, hp, atk, defense):
        self.name = name
        self.hp = hp
        self.atk = atk
        self.defense = defense
    
    def __str__(self):
        return f"名字是{self.name},血量为：{self.hp},攻击力为：{self.atk},防御力为：{self.defense}"   
        
    def __repr__(self):
        return "Enemy('%s', %d, %d, %d)"%(self.name, self.hp, self.atk,self.defense)

zs = Enemy('张三', 1000, 100, 100)
print(zs)

# 必须重写repr方法才行
ls = eval(repr(zs))
ls.name = '李四'
print(ls)